package createThread;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 案例：创建线程任务的三种方式
 */
@Slf4j
public class CreateThreadTest {

    private static int dd = 3;

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //方法一：使用匿名内部类重写Thread的run()方法
        Thread t1 = new Thread() {
            @Override
            public void run() {
                try {
                    sleep(dd+10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                log.debug("子线程打印");
            }
        };
        t1.setName("t1");
        t1.start();
//        t1.interrupt();
        log.debug("主线程打印");

        //方法二：使用Runnable配合Thread
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                //要执行的任务
            }
        };
        Thread t2 = new Thread(runnable);
        t2.start();
        //   使用lambda表达式简写
        Runnable runnable2 = () -> {
            //要执行的任务
        };

        //方法三：使用FutureTask配合Thread
        FutureTask<Integer> task3 = new FutureTask<>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                log.debug("hello");
                return 100;
            }
        });
        //构造器参数1：任务对象 参数2：线程名字
        new Thread(task3, "t3").start();
        //task3.get()方法会阻塞当前线程，等待任务执行完毕获取返回结果
        Integer result = task3.get();
        log.debug("任务运行结果是：{}", result);
    }

}
